package com.wsestadio.service.impl;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.wsestadio.dao.AsientoDAO;
import com.wsestadio.dao.EstadioDAO;
import com.wsestadio.dao.ParametroDAO;
import com.wsestadio.dominio.Asiento;
import com.wsestadio.dominio.Estadio;
import com.wsestadio.service.RegistroService;
@Service("RegistroService")
public class RegistroServiceImpl implements RegistroService {

	@Autowired
	private ParametroDAO parametroDAO;
	@Autowired
	private AsientoDAO asientoDAO;
	@Autowired
	private EstadioDAO estadioDAO;
	
	@Override
	@Transactional
	public Estadio registrarNuevoEstadio(String uuid,Estadio estadio, 
			int cantidadAsientosTribunaNorte, 
			int cantidadAsientosTribunaOeste, 
			int cantidadAsientosTribunaEste,
			int cantidadAsientosTribunaSur) {
		estadio.setCodigoUsuario(uuid);
		estadioDAO.guardar(estadio);
		boolean updateAsientos = false;
		if (estadio.getCantidadAsientos() > 300) {
			updateAsientos = true;
		}
		if (updateAsientos) {
			{
				Asiento asientoNorte = null;
				for (int i = 0; i < cantidadAsientosTribunaNorte; i++) {
					asientoNorte = new Asiento();
					asientoNorte.setActivo(true);
					asientoNorte.setEstadio(estadio);
					asientoNorte.setFechaRegistro(new Date());
					asientoNorte.setFechaActualizada(new Date());
					asientoNorte.setNumero(estadio.getNombre().substring(2) + "-" + i);
					asientoNorte.setTribuna(1);
					asientoNorte.setCodigoUsuario(uuid);
					asientoDAO.guardar(asientoNorte);
				}
			}
			{
				Asiento asientoOEste = null;
				for (int i = 0; i < cantidadAsientosTribunaOeste; i++) {
					asientoOEste = new Asiento();
					asientoOEste.setActivo(true);
					asientoOEste.setEstadio(estadio);
					asientoOEste.setFechaRegistro(new Date());
					asientoOEste.setFechaActualizada(new Date());
					asientoOEste.setNumero(estadio.getNombre().substring(2) + "-" + i);
					asientoOEste.setTribuna(2);
					asientoOEste.setCodigoUsuario(uuid);
					asientoDAO.guardar(asientoOEste);
				}
			}
			{
				Asiento asientoEste = null;
				for (int i = 0; i < cantidadAsientosTribunaEste; i++) {
					asientoEste = new Asiento();
					asientoEste.setActivo(true);
					asientoEste.setEstadio(estadio);
					asientoEste.setFechaRegistro(new Date());
					asientoEste.setFechaActualizada(new Date());
					asientoEste.setNumero(estadio.getNombre().substring(2) + "-" + i);
					asientoEste.setTribuna(3);
					asientoEste.setCodigoUsuario(uuid);
					asientoDAO.guardar(asientoEste);
				}
			}
			{
				Asiento asientoSur = null;
				for (int i = 0; i < cantidadAsientosTribunaSur; i++) {
					asientoSur = new Asiento();
					asientoSur.setActivo(true);
					asientoSur.setEstadio(estadio);
					asientoSur.setFechaRegistro(new Date());
					asientoSur.setFechaActualizada(new Date());
					asientoSur.setNumero(estadio.getNombre().substring(2) + "-" + i);
					asientoSur.setTribuna(4);
					asientoSur.setCodigoUsuario(uuid);
					asientoDAO.guardar(asientoSur);
				}
			}

		}
		estadio.setFechaActualizada(new Date());
		
		System.out.println("estadio");
		System.out.println(estadio.getResponsable());
		
		estadioDAO.guardar(estadio);
		return estadio;
	}

	@Override
	@Transactional
	public Estadio actualizarEstadio(String uuid, Estadio estadio, int cantidadAsientosTribunaNorte, int cantidadAsientosTribunaOeste, int cantidadAsientosTribunaEste,
			int cantidadAsientosTribunaSur) throws Exception {	
		Estadio estadioBD = estadioDAO.get(estadio.getId());
		int totalBD = estadioBD.getCantidadAsientos();
		boolean updateAsientos = false;
		if ((totalBD != estadio.getCantidadAsientos()) && estadio.getCantidadAsientos()>300) {
			updateAsientos = true;
		}
		estadioBD.setActivo(estadio.getActivo());
		estadioBD.setCantidadAsientos(estadio.getCantidadAsientos());
		estadioBD.setCodigoUsuario(estadio.getCodigoUsuario());
		estadioBD.setDireccion(estadio.getDireccion());
		estadioBD.setNombre(estadio.getNombre());
		estadioBD.setReferencia(estadio.getReferencia());
		estadioBD.setResponsable(estadio.getResponsable());
		estadioBD.setUbigeo(estadio.getUbigeo());
		asientoDAO.deleteAsientosPorEstadios(estadio);
		if (updateAsientos) {
			{
				Asiento asientoNorte = null;
				for (int i = 0; i < cantidadAsientosTribunaNorte; i++) {
					asientoNorte = new Asiento();
					asientoNorte.setActivo(true);
					asientoNorte.setEstadio(estadio);
					asientoNorte.setFechaRegistro(new Date());
					asientoNorte.setFechaActualizada(new Date());
					asientoNorte.setNumero(estadio.getNombre().substring(2) + "-" + i);
					asientoNorte.setTribuna(1);
					asientoNorte.setCodigoUsuario(uuid);
					asientoDAO.guardar(asientoNorte);
				}
			}
			{
				Asiento asientoOEste = null;
				for (int i = 0; i < cantidadAsientosTribunaOeste; i++) {
					asientoOEste = new Asiento();
					asientoOEste.setActivo(true);
					asientoOEste.setEstadio(estadio);
					asientoOEste.setFechaRegistro(new Date());
					asientoOEste.setFechaActualizada(new Date());
					asientoOEste.setNumero(estadio.getNombre().substring(2) + "-" + i);
					asientoOEste.setTribuna(2);
					asientoOEste.setCodigoUsuario(uuid);
					asientoDAO.guardar(asientoOEste);
				}
			}
			{
				Asiento asientoEste = null;
				for (int i = 0; i < cantidadAsientosTribunaEste; i++) {
					asientoEste = new Asiento();
					asientoEste.setActivo(true);
					asientoEste.setEstadio(estadio);
					asientoEste.setFechaRegistro(new Date());
					asientoEste.setFechaActualizada(new Date());
					asientoEste.setNumero(estadio.getNombre().substring(0, 2) + "-" + i);
					asientoEste.setTribuna(3);
					asientoEste.setCodigoUsuario(uuid);
					asientoDAO.guardar(asientoEste);
				}
			}
			{
				Asiento asientoSur = null;
				for (int i = 0; i < cantidadAsientosTribunaSur; i++) {
					asientoSur = new Asiento();
					asientoSur.setActivo(true);
					asientoSur.setEstadio(estadio);
					asientoSur.setFechaRegistro(new Date());
					asientoSur.setFechaActualizada(new Date());
					asientoSur.setNumero(estadio.getNombre().substring(2) + "-" + i);
					asientoSur.setTribuna(4);
					asientoSur.setCodigoUsuario(uuid);
					asientoDAO.guardar(asientoSur);
				}
			}
		}
		estadio.setFechaActualizada(new Date());
		estadioDAO.guardar(estadioBD);			
		return estadio;
	}

	@Override
	@Transactional
	public void cambiarEstadoActivadoEstadio(Estadio estadio, boolean activo) {
		estadio = estadioDAO.get(estadio.getId());
		estadio.setActivo(activo);
		estadio.setFechaActualizada(new Date());
		estadioDAO.guardar(estadio);	
	}

	@Override
	public List<Estadio> getListaEstadios() {		
		return estadioDAO.getTodos();
	}

	@Override
	public List<Estadio> listarEstadiosActivos() throws Exception {
		return estadioDAO.getBasicService().getListaEstadioByActivo(true, null, null);
//		return estadioDAO.getListaEstadiosActivos();
	}

	@Override
	public Estadio getEstadio(long idEstadio) {		
		return estadioDAO.get(idEstadio);
	}

	
	
	
}
